package mx.itesm.thirstforrevenge;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.view.MotionEvent;
import android.view.View;

/**
* @author Raúl Oscar Irene Rivas
* @author Juan Carlos Felipe Torres
* @author Victor López
* @author Ivan Haecker
* @version 1.1
*/


public class Juego extends View {

	private Paint p;
	private boolean pausado;
	
	private Enemigo navio;
	private Enemigo avion;
	private Enemigo barco;
	
	private Sprite base;
	
	private Bitmap score;
	private Bitmap bonus;
	private Bitmap vida;

	private int coordBaseX = 0;
	private int coordBaseY = 240;
	private int coordNavioX = 800;
	private int coordNavioY = 300;
	private int coordAvionX = 1400;
	private int coordAvionY = 80;
	private int coordProX = coordBaseX+130; 
	private int coordProY = coordBaseY+20;
	private int coordBarcoX = 1100;
	private int coordBarcoY = 250;

	//Para calcular área 
	//private boolean flagExp;
	//private Bitmap explota;

	//Creando un proyectil
	private Proyectil proyectil;

	private float xOnTouch = 0;
	private float yOnTouch = 0;
	
	//Esto sera un boton(pausa)
	private Bitmap pausa;

	//private int numNivel=1;
	private Nivel fondo;

	/** 
	 * Crea los objetos a ser utilizados durante el desarrollo del juego
	 * @param Context
	 * @return
	*/
	public Juego(Context contexto){
		super(contexto);
		p = new Paint();

		//Creamos el fondo 
		score = BitmapFactory.decodeResource(getResources(), R.drawable.score);
		bonus = BitmapFactory.decodeResource(getResources(), R.drawable.radioactivo);
		vida = BitmapFactory.decodeResource(getResources(), R.drawable.vida);
		pausa = BitmapFactory.decodeResource(getResources(), R.drawable.pausa);

		fondo = new Nivel(getResources(), Dificultad.nivel);
		//explota = BitmapFactory.decodeResource(getResources(), R.drawable.explosion);
		//Creamos el sprite

		int []arrBase = {R.drawable.barcobasedos,R.drawable.barcobaseuno};
		base = new Sprite(getResources(),arrBase,coordBaseX,coordBaseY);

		int []arrNavio = { R.drawable.navio, R.drawable.navioespuma};
		navio = new Enemigo(getResources(),arrNavio,coordNavioX,coordNavioY);

		int []arrAvion = { R.drawable.avion, R.drawable.avionhumo};
		avion = new Enemigo(getResources(),arrAvion,coordAvionX,coordAvionY);

		int []arrProyectil = {R.drawable.proyectil, R.drawable.proyectil2,
				R.drawable.proyectil3,R.drawable.proyectil4,R.drawable.proyectil5};
		proyectil = new Proyectil(getResources(),arrProyectil,coordProX,coordProY);

		int []arrBarco = {R.drawable.barco,R.drawable.barcoespuma};
		barco = new Enemigo(getResources(),arrBarco,coordBarcoX,coordBarcoY);

	}

	/**
	 * Dibuja en pantalla los objetos deseados.
	 * @param Canvas
	*/
	protected void onDraw(Canvas canvas){
		super.onDraw(canvas);
		canvas.drawRGB(0xFF, 0xFF, 0xFF);

		//Dibujando un fondo
		fondo.draw(canvas, p);
		//canvas.drawBitmap(fondo,-10 , -50, p);
		//Dibuja score
		canvas.drawBitmap(score, 500, 0, p);
		//Dibuja bonus
		canvas.drawBitmap(bonus, 350, 0, p);
		//Dibuja vida
		canvas.drawBitmap(vida, 700, 5, p);
		//Dibujando pausa
		canvas.drawBitmap(pausa, 30, 5, p);

		//Dibuja
		p.setColor(Color.RED);

		//Dibujar barco
		barco.onDraw(canvas, p);
		//Dibujar avion
		avion.onDraw(canvas, p);
		//Dibujando base
		base.draw(canvas, p);
		//Dibujar soldado
		navio.onDraw(canvas, p);
		//dibujar proyectil
		proyectil.draw(canvas, p);

		if (pausado){
			p.setColor(0x44000000);
			canvas.drawRect(0, 0, getWidth(), getHeight(), p);
			Path circle = new Path();
			int centerX = canvas.getWidth()/2;
			int centerY = canvas.getHeight()/2;
			int r = Math.min(centerX, centerY);
			RectF rect = new RectF(getWidth()/2-r, getHeight()/2-r,getWidth()/2+r, getHeight()/2+r);
			//	canvas.drawText("Esto es una pausa temporal", 100, 10, p);

			circle.addArc(rect, 180,180);
			p.setColor(Color.WHITE);
			p.setTextSize(24);
			p.setAntiAlias(true);
			canvas.drawTextOnPath("Pausa", circle, 0, 100, p);

		}
		//Solamente dibujar... Nada de acciones...
	}

	/**
	 * Lee las preferencias del juego y las actualiza
	*/
	public void leerEntrada() {
		//Lectura del teclado
		//Leer acelerómetro y actualizar x, y, z
		barco.setVelMovEne(Dificultad.dificultad);
		navio.setVelMovEne(Dificultad.dificultad);
		avion.setVelMovEne(Dificultad.dificultad);
	}
	
	/**
	 * Revisa si existen colisiones o si está pausado el juego, es el encargado de actualizar todo el juego
	 * @exception printStackTrace();
	*/
	public void actualizar() {
		// Aquí actualizará el juego lo cual se 
		//toman decisiones de la entrada del teclado
		if( !pausado){
			try {
				base.movFijo();
				//Si el usuario da click en la pantalla, se lanza un proyectil a las coordenadas.
				
				if(avion.getMovX()< coordProX){
					avion.destruir();
				}else{
					avion.nextFrame();
				}
				if(navio.getMovX()< coordProX){
					navio.destruir();
				}else{
					navio.nextFrame();
				}
				if(barco.getMovX()< coordProX){
					barco.destruir();
				}else{
					barco.nextFrame();
				}
	
				if(xOnTouch > coordProX ){
					if(yOnTouch > 0){												
						proyectil.nextFrame();
						proyectil.dispara(xOnTouch, yOnTouch);						
						if(
								avion.getMovY() + 50 > proyectil.getMovY() &&
								avion.getMovY() + 50 > proyectil.getMovY() + 15 &&
								avion.getMovY() < proyectil.getMovY() &&
								avion.getMovY() < proyectil.getMovY() + 15
								){							
							if(
									proyectil.getMovX() + 15 > avion.getMovX() &&
									proyectil.getMovX() < avion.getMovX() + 70 &&
									proyectil.getMovX() + 15 < avion.getMovX() + 70 &&
									proyectil.getMovX() > avion.getMovX()							
									){								
								avion.destruir();
								proyectil.destruye();
								xOnTouch = 0;
								yOnTouch = 0;								
								flagDisparo = true;								
							}		
						}	
						
						if(navio.getMovY()+ 50 > proyectil.getMovY() &&
								navio.getMovY() + 50 > proyectil.getMovY()+15 &&
								navio.getMovY() < proyectil.getMovY() &&
								navio.getMovY() < proyectil.getMovY()+15
								){
							
							if(proyectil.getMovX() + 15 > navio.getMovX() &&
									proyectil.getMovX() < navio.getMovX() +70 &&
									proyectil.getMovX() + 15 < navio.getMovX() + 70 &&
									proyectil.getMovX() > navio.getMovX()									
									){
								
								navio.destruir();
								proyectil.destruye();
								xOnTouch = 0;
								yOnTouch = 0;
								
								flagDisparo = true;
							}		
						}	
						
						
						if(barco.getMovY()+ 50 > proyectil.getMovY() &&
								barco.getMovY() + 50 > proyectil.getMovY()+15 &&
								barco.getMovY() < proyectil.getMovY() &&
								barco.getMovY() < proyectil.getMovY()+15
								){
							
							if(proyectil.getMovX()+15 > barco.getMovX() &&
									proyectil.getMovX() < barco.getMovX() +50 &&
									proyectil.getMovX() + 15 < barco.getMovX() + 50 &&
									proyectil.getMovX() > barco.getMovX()									
									){
								
								barco.destruir();
								proyectil.destruye();
								xOnTouch = 0;
								yOnTouch = 0;
								
								flagDisparo = true;
							}		
						}	
						
						
						if(proyectil.getMovX() >= 1000 | proyectil.getMovY() >= 400 | -10 >= proyectil.getMovY()){
							proyectil.destruye();
							xOnTouch = 0; 
							yOnTouch = 0;
							flagDisparo = true;	
						}						
					}
				}

				


			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}

	private boolean flagDisparo = true;
	
	/**
	 * Revisa si se ha tocado la pantalla.
	 * @param MotionEvent
	 * @return true or false
	*/
	public boolean onTouchEvent(MotionEvent event){
		switch(event.getAction()){
		case MotionEvent.ACTION_DOWN:

			if(event.getX()<74 && event.getY()<48){
				if(event.getX()>30&& event.getY()>5){
					pausado = !pausado;
				}	
			}
			//Toast.makeText(this.getContext(), event.getX()+"", Toast.LENGTH_SHORT).show();
			//Toast.makeText(this.getContext(), event.getY()+"", Toast.LENGTH_SHORT).show();

			break;
		case MotionEvent.ACTION_UP:
			
			//Toast.makeText(this.getContext(), event.getX()+"", Toast.LENGTH_SHORT).show();
			if(flagDisparo == true){
				if(event.getX()<coordProX){
					break;	
				}else{
					xOnTouch = (int)event.getX();
					yOnTouch = (int)event.getY();
					flagDisparo = false;
					break;
				}
				
			}
			
			break;

		case MotionEvent.ACTION_MOVE:
			//	Toast.makeText(this.getContext(), event.getY()+"", Toast.LENGTH_SHORT).show();
			//base.setMovY((int)event.getY());
			break;

		default:
			return false;
		}
		return true;
	}




}


